package cn.itcast.web.controller.system;

import cn.itcast.domain.system.Dept;
import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.Role;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.RoleService;
import cn.itcast.web.controller.BaseController;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/system/role")
public class RoleController extends BaseController {

	@Autowired
	private RoleService roleService;

	@Autowired
	private ModuleService moduleService;

	/**
	 * 分页查询
	 */
	@RequestMapping("/list")
	public String list(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "5")int size) {
		PageInfo info = roleService.findAll(page, size, getLoginCompanyId());
		request.setAttribute("page",info);
		return "system/role/role-list";
	}

	//进入保存
	@RequestMapping("/toAdd")
	public String toAdd() {
		return  "system/role/role-add";
	}

	@RequestMapping("/toUpdate")
	public String toUpdate(String id) {
		//1.根据id查询
		Role role = roleService.findById(id);
		request.setAttribute("role",role);
		return  "system/role/role-update";
	}

	//新增或者修改
	@RequestMapping("/edit")
	public String edit(Role role) {
		//1.设置企业属性
		role.setCompanyId(getLoginCompanyId());
		role.setCompanyName(getLoginCompanyName());
		//2.判断是否具有id
		if (StringUtils.isEmpty(role.getId())) {
			//3.没有id，调用service保存
			roleService.save(role);
		}else {
			//4.存在id，调用service更新
			roleService.update(role);
		}
		//5.重定向到列表
		return  "redirect:/system/role/list.do";
	}

	@RequestMapping("/delete")
	public String delete(String id) {
		roleService.delete(id);
		return  "redirect:/system/role/list.do";
	}

	/**
	 * /system/role/roleModule.do?roleid=2b657b32-6539-4b09-898e-42ba6f807a52
	 * 进入到分配模块权限的页面
	 *  参数：roleid
	 *  业务：根据id查询角色
	 */
	@RequestMapping("/roleModule")
	public String roleModule(String roleid) {
		//根据id查询角色
		Role role = roleService.findById(roleid);
		request.setAttribute("role",role);
		return  "system/role/role-module";
	}

	/**
	 * 1、接收页面发送的ajax请求
	 * 2、响应的数据：
	 *         [
	 *           { id:111, pId:11, name:"随意勾选 1-1-1"},
	 *           { id:112, pId:11, name:"随意勾选 1-1-2"}
	 *         ]
	 * 3、mvc中为了响应ajax请求，返回数据
	 *      @ResponseBody ：将对象转化为json字符串并响应
	 * 4、业务逻辑处理
	 *   1.查询所有的模块  ：List<Module> list
	 *   2.数据转化 ：将模块封装为map结构
	 *   3.优化数据回显：
	 *      3.1 查询当前角色具有的所有模块操作权限
	 *      3.2 判断对比
	 *      参数：
	 */
	@RequestMapping("/getZtreeNodes")
	public @ResponseBody List<Map> getZtreeNodes(String roleId) {
		List<Map> list = new ArrayList<>();
		//查询所有的模块
		List<Module> modules = moduleService.findAll();
		// 查询当前角色具有的所有模块操作权限
		List<Module> roleModules = moduleService.findByRoleId(roleId); //系统管理，用户管理
		//数据转化
		for (Module module : modules) {    //所有模块  -----系统管理，用户管理，企业管理，角色管理
			Map map = new HashMap();
			map.put("id",module.getId());
			map.put("pId",module.getParentId());
			map.put("name",module.getName());
			if(roleModules.contains(module)) {
				map.put("checked", true);
			}
			list.add(map);
		}
		return list;
	}


	/**
	 * 执行权限分配
	 *  参数：
	 *      1.角色的id：            roleid
	 *      2.所有勾选的模块id：     moduleIds（字符串，中间通过“，”隔开）
	 *  业务：
	 *      调用service
	 */
	@RequestMapping("/updateRoleModule")
	public String updateRoleModule(String roleid,String moduleIds) {
		//调用service
		moduleService.updateRoleModule(roleid,moduleIds);
		return  "redirect:/system/role/list.do";
	}

}
